#ifndef _COMMON_HPP
#define _COMMON_HPP

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cerrno>
#include <cstdlib>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

#define SHM_NAME "/tmp"
#define SHM_NUM 'a'
#define SHM_SIZE 4096

using namespace std;

//获取共享内存的关键码
int getkey()
{
    int key=ftok(SHM_NAME,SHM_NUM);
    if(key<0)//获取失败
    {
        cerr<<"getkey failed:"<<strerror(errno)<<endl;
        exit(1);//获取失败，终止进程
    }
    //获取成功
    return key;
}

//创建共享内存
int createShm(key_t key)
{
    int shmid=shmget(key,SHM_SIZE,IPC_CREAT | IPC_EXCL | 0600);
    if(shmid<0)//创建失败
    {
        cerr<<"createShm failed:"<<strerror(errno)<<endl;
        exit(1);//创建失败，终止进程
    }
    //创建成功
    return shmid;
}

//获取共享内存
int getShm(key_t key)
{
    int shmid=shmget(key,SHM_SIZE,IPC_CREAT);
    if(shmid<0)//获取失败
    {
        cerr<<"getShm failed:"<<strerror(errno)<<endl;
        exit(1);//获取失败，终止进程
    }
    //获取成功
    return shmid;
}

//挂接共享内存
void* attachShm(int shmid)
{
    void* start=shmat(shmid,nullptr,0);
    if((long long)start==-1)//挂接失败
    {
        cerr<<"attachShm failed:"<<strerror(errno)<<endl;
        exit(1);//挂接失败，终止进程
    }
    //挂接成功
    return start;//返回共享内存映射到进程地址空间的起始位置
}

//删除共享内存
void deleteShm(int shmid)
{
    int res=shmctl(shmid,IPC_RMID,nullptr);
    if(res==-1)//删除失败
    {
        cerr<<"deleteShm failed:"<<strerror(errno)<<endl;
        exit(1);//删除共享内存失败，终止进程
    }
}


#endif